import 'reflect-metadata'


// 给对象或者属性上添加元数据, 不修改原始对象, 不增加内容
let target = {}
// 给对象添加元数据属性
Reflect.defineMetadata('name', 'sanfeng', target)
// 给对象的属性添加元数据
Reflect.defineMetadata('age', 18, target, 'level')
// 获取元数据, 对象上name 这个元数据
console.log(Reflect.getOwnMetadata('name', target))
// 获取 对象target的元数据字段level上的age信息
console.log(Reflect.getOwnMetadata('age', target, 'level'))


// 装饰器
// 1. 所有对类的装饰 都是定义在对象上的
// 2. 所有对类的属性和方法的装饰 都是定义在原型上的 并且以属性或方法的key 作为我们的属性


// 给类和类中的方法定义元数据
@Reflect.metadata('name', 'Person类')
class Person {
  @Reflect.metadata('name', 'Person\'s method: say')
  say(): string {
    return 'saying'
  }
}
// 获取类Person上的元数据name
console.log(Reflect.getMetadata('name', Person))
// 获取Person类原型say方法的元数据
console.log(Reflect.getMetadata('name', Person.prototype, 'say'))


// 原理实现 反射
